package com.nehc.nettyserver.service;

import com.nehc.nettyserver.common.model.Message;
import io.netty.channel.Channel;

import java.util.List;
import java.util.Map;

/**
 * 消息服务接口
 * 
 * @author NEHC
 */
public interface MessageService {
    
    /**
     * 保存消息
     * 
     * @param message 消息对象
     * @return 是否成功
     */
    boolean saveMessage(Message message);
    
    /**
     * 获取消息
     * 
     * @param messageId 消息ID
     * @return 消息对象
     */
    Message getMessage(String messageId);
    
    /**
     * 获取用户的最新消息
     * 
     * @param userId 用户ID
     * @param limit 最大消息数
     * @return 消息列表
     */
    List<Message> getUserMessages(String userId, int limit);
    
    /**
     * 获取消息统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息
     */
    MessageStats getMessageStats(long startTime, long endTime);
    
    /**
     * 消息统计信息
     */
    class MessageStats {
        /**
         * 消息总数
         */
        private long totalMessages;
        
        /**
         * 按类型统计的消息数
         */
        private java.util.Map<Message.Type, Long> messagesByType;
        
        /**
         * 每小时消息数
         */
        private java.util.Map<Integer, Long> messagesByHour;
        
        /**
         * 活跃用户数
         */
        private long activeUsers;
        
        /**
         * 活跃连接数
         */
        private long activeConnections;
        
        // 添加getter和setter方法
        public long getTotalMessages() {
            return totalMessages;
        }
        
        public void setTotalMessages(long totalMessages) {
            this.totalMessages = totalMessages;
        }
        
        public java.util.Map<Message.Type, Long> getMessagesByType() {
            return messagesByType;
        }
        
        public void setMessagesByType(java.util.Map<Message.Type, Long> messagesByType) {
            this.messagesByType = messagesByType;
        }
        
        public java.util.Map<Integer, Long> getMessagesByHour() {
            return messagesByHour;
        }
        
        public void setMessagesByHour(java.util.Map<Integer, Long> messagesByHour) {
            this.messagesByHour = messagesByHour;
        }
        
        public long getActiveUsers() {
            return activeUsers;
        }
        
        public void setActiveUsers(long activeUsers) {
            this.activeUsers = activeUsers;
        }
        
        public long getActiveConnections() {
            return activeConnections;
        }
        
        public void setActiveConnections(long activeConnections) {
            this.activeConnections = activeConnections;
        }
    }

    /**
     * 处理收到的消息
     *
     * @param channel 客户端通道
     * @param message 消息内容
     */
    void handleMessage(Channel channel, String message);

    /**
     * 向指定客户端发送消息
     *
     * @param clientId 客户端ID
     * @param message 消息内容
     * @param messageType 消息类型
     * @return 是否成功
     */
    boolean sendToClient(String clientId, Object message, String messageType);

    /**
     * 广播消息给所有客户端
     *
     * @param message 消息内容
     * @param messageType 消息类型
     * @return 成功发送的客户端数量
     */
    int broadcast(Object message, String messageType);

    /**
     * 广播消息给指定组的客户端
     *
     * @param groupId 组ID
     * @param message 消息内容
     * @param messageType 消息类型
     * @return 成功发送的客户端数量
     */
    int broadcastToGroup(String groupId, Object message, String messageType);

    /**
     * 获取客户端的消息历史
     *
     * @param clientId 客户端ID
     * @param limit 限制条数
     * @param offset 偏移量
     * @return 消息列表
     */
    List<Message> getClientMessageHistory(String clientId, int limit, int offset);
} 